package view.backing.gastos;

import chemtools_logica.Beans.AlmacenBean;
import chemtools_logica.Beans.BancoBean;
import chemtools_logica.Beans.GastoBean;
import chemtools_logica.Beans.gastoGraficoBean;
import chemtools_logica.Beans.TipogastoBean;
import chemtools_logica.Beans.UsuarioBean;

import chemtools_logica.Entidades.Graficogasto;

import chemtools_logica.LN.IR.LN_SFBancoRemote;
import chemtools_logica.LN.IR.LN_SFGastoRemote;

import javax.script.*;

import chemtools_logica.LN.IR.LN_SFTipogastoRemote;

import chemtools_logica.LN.IR.LN_SFUbigeoRemote;

import java.io.IOException;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

import java.nio.file.Path;
import java.nio.file.Paths;

import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import javax.script.ScriptException;

import javax.servlet.http.HttpSession;

import oracle.adf.view.faces.bi.component.chart.UIBarChart;
import oracle.adf.view.faces.bi.component.chart.UIDataItem;
import oracle.adf.view.faces.bi.component.graph.UIGraph;
import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.RichPopup;
import oracle.adf.view.rich.component.rich.data.RichTable;
import oracle.adf.view.rich.component.rich.input.RichInputDate;
import oracle.adf.view.rich.component.rich.input.RichSelectOneChoice;
import oracle.adf.view.rich.component.rich.nav.RichButton;

import org.apache.myfaces.trinidad.event.SelectionEvent;

import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;

import org.apache.myfaces.trinidad.util.Service;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import view.backing.Utils.Utils;

public class Frm_gastos {

    //COMPONENTES
    private RichForm formGastos;
    private bSessionScopeBeangastos sessionScopeBeangastos;
    private RichButton btnEditar;
    private RichPopup popEditar;
    private RichTable tbGastos;
    private RichPopup popAgregar;
    
    //CONEXCIONES
    private bSessionScopeBeangastos sessionScopeBeaninsumo = new bSessionScopeBeangastos();
    private LN_SFGastoRemote lN_SFGastoRemote;
    private LN_SFBancoRemote lN_SFBancoRemote;
    private LN_SFTipogastoRemote lN_SFTipogastoRemote;
    private LN_SFUbigeoRemote lN_SFUbigeoRemote;
    private RichSelectOneChoice selectBancoAgregar;
    private RichSelectOneChoice selecTipoGastoAgregar;
    private RichSelectOneChoice selectTipoGastoBuscar;
    private RichSelectOneChoice selectBancoBuscar;
    private RichButton btnAgregarBanco;
    private RichPopup popAgregarBanco;
    private RichButton btnAgregarTGasto;
    private RichPopup popAgregarGasto;
    private RichSelectOneChoice selectProvincia;
    private RichSelectOneChoice selectDistrito;
    private RichInputDate dateFechaMin;
    private RichInputDate dateFechaMax;
    private UIBarChart chartGastos;
    private UIGraph barch;
    private UIDataItem datoChart;

    @PostConstruct
    public void methodInvokeOncedOnPageLoad() {
        try {
            final Context context = getInitialContext();
            lN_SFGastoRemote = (LN_SFGastoRemote) context.lookup("map-LN_SFGasto#chemtools_logica.LN.IR.LN_SFGastoRemote");
            lN_SFBancoRemote = (LN_SFBancoRemote) context.lookup("map-LN_SFBanco#chemtools_logica.LN.IR.LN_SFBancoRemote");
            lN_SFTipogastoRemote = (LN_SFTipogastoRemote) context.lookup("map-LN_SFTipogasto#chemtools_logica.LN.IR.LN_SFTipogastoRemote");
            lN_SFUbigeoRemote = (LN_SFUbigeoRemote) context.lookup("map-LN_SFUbigeo#chemtools_logica.LN.IR.LN_SFUbigeoRemote");
        }catch(Exception e){}

        HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        UsuarioBean usuario = (UsuarioBean) sesion.getAttribute("usuario");
        
        sessionScopeBeangastos.setListaGastos(lN_SFGastoRemote.getAllGastos());
        sessionScopeBeangastos.setListaBanco(this.llenarBancos());
        sessionScopeBeangastos.setListaEstados(this.llenarEstados());
        sessionScopeBeangastos.setListaTipoGasto(this.llenaTGasto());
        sessionScopeBeangastos.setListaDepart(this.llenarDepartamentos());
        sessionScopeBeangastos.setListaGrafico(lN_SFGastoRemote.chartGasto());
    }
    
    public void refrescarGrafico(ActionEvent event){
        sessionScopeBeangastos.setListaGrafico(lN_SFGastoRemote.chartGasto());
        getChartGastos().setValue(lN_SFGastoRemote.chartGasto());
        Utils.addTarget(getChartGastos());
        Utils.addTarget(getDatoChart());
    }
    
    public void onLoadofPage(ActionEvent event){
        try {
            List<Graficogasto> lista = null;
                JSONObject responseDetailsJson = new JSONObject();
                JSONArray jsonArray = new JSONArray();
                for(Graficogasto p : lista) {
                    JSONObject formDetailsJson = new JSONObject();
                    formDetailsJson.put("y", p.getMes()+","+p.getAno());
                    formDetailsJson.put("a", p.getMonto());
                    jsonArray.put(formDetailsJson);
                }
            StringBuffer script = new StringBuffer();
            ExtendedRenderKitService service = Service.getRenderKitService(FacesContext.getCurrentInstance(),ExtendedRenderKitService.class);
            script.append("onPageLoad(");
            script.append(""+jsonArray+"");
            script.append(")");
            System.out.println(script.toString());
            service.addScript(FacesContext.getCurrentInstance(), script.toString());
        } catch (JSONException e) {
        }
    }
    
    public void gastoSelect(SelectionEvent se){
        RichTable t = (RichTable)se.getSource();
        GastoBean beanGasto = (GastoBean) t.getSelectedRowData();
        sessionScopeBeangastos.setGestoSeleccionado(beanGasto);
        
        getBtnEditar().setDisabled(false);
        Utils.addTarget(getBtnEditar());
    }
    
    public void limpiarRefrescar(ActionEvent event){
        getSelectBancoBuscar().setValue(0);
        getSelectTipoGastoBuscar().setValue(0);
        getDateFechaMax().setValue("");
        getDateFechaMin().setValue("");
        getBtnEditar().setDisabled(true);
        sessionScopeBeangastos.setListaGastos(lN_SFGastoRemote.getAllGastos());
        getTbGastos().setValue(sessionScopeBeangastos.getListaGastos());
        
        Utils.addTargetMany(getSelectBancoBuscar(),getSelectTipoGastoBuscar(),getBtnEditar(),getTbGastos(),
                            getDateFechaMax(),getDateFechaMin());
    }
    
    public void abrirPOPEdit(ActionEvent event){
        GastoBean beanGasto = sessionScopeBeangastos.getGestoSeleccionado();
        
        sessionScopeBeangastos.setTipoGastoEdit(beanGasto.getNombreTipoGasto());
        sessionScopeBeangastos.setPersonaEdit(beanGasto.getNombrePersona());
        sessionScopeBeangastos.setFechaEdit(beanGasto.getFecha().toString());
        sessionScopeBeangastos.setMontoEdit(""+beanGasto.getMonto());
        sessionScopeBeangastos.setBancoEdit(beanGasto.getIdBanco());
        sessionScopeBeangastos.setEstadoEdit(beanGasto.getEstado());
        
        Utils.showPopUpMIDDLE(getPopEditar());
    }
    
    public void agregarGasto(ActionEvent event){
        GastoBean bean = new GastoBean();
        int idBanco = sessionScopeBeangastos.getBancoAgregar();
        int idTipoGasto = sessionScopeBeangastos.getTipoGastoAgregar();
        int monto = Integer.parseInt(sessionScopeBeangastos.getMontoAgregar());
        String comentario = sessionScopeBeangastos.getComentarioAgregar();
        
        bean.setIdBanco(idBanco);
        bean.setIdTipoGasto(idTipoGasto);
        bean.setMonto(monto);
        bean.setFecha(new Date());
        bean.setComentario(comentario);
        bean.setIdUsuario(1);
        bean.setEstado(1);
        
        lN_SFGastoRemote.addGasto(bean);
        
        this.limpiarRefrescar(null);
    
        getPopAgregar().hide();
        
        this.refrescarGrafico(null);
    }
    
    public void editarGasto(ActionEvent event){
        if(sessionScopeBeangastos.isCambioHecho()){//¿cambioHecho es true?
            GastoBean beanGasto = sessionScopeBeangastos.getGestoSeleccionado();
            int monto = Integer.parseInt(sessionScopeBeangastos.getMontoEdit());
            int banco = sessionScopeBeangastos.getBancoEdit();
            int estado = sessionScopeBeangastos.getEstadoEdit();
            
            beanGasto.setMonto(monto);
            beanGasto.setIdBanco(banco);
            beanGasto.setEstado(estado);
            
            lN_SFGastoRemote.updateGasto(beanGasto);
            getPopEditar().hide();
            
            sessionScopeBeangastos.setListaGastos(lN_SFGastoRemote.getAllGastos());
            getTbGastos().setValue(sessionScopeBeangastos.getListaGastos());
            Utils.clearRowSelection(getTbGastos());
            Utils.addTarget(tbGastos);
            
            getBtnEditar().setDisabled(true);
            Utils.addTarget(getBtnEditar());
            this.refrescarGrafico(null);
        }else{
            getPopEditar().hide();
        }
    }
    
    public void cambioHecho(ValueChangeEvent vce){
        sessionScopeBeangastos.setCambioHecho(true);
    }
    
    public void abrirPOPAgregar(ActionEvent event){
        getSelectBancoAgregar().setValue(0);
        getSelecTipoGastoAgregar().setValue(0);
        sessionScopeBeangastos.setMontoAgregar(null);
        sessionScopeBeangastos.setComentarioAgregar(null);
        
        Utils.showPopUpMIDDLE(getPopAgregar());
    }
    
    public void buscarGasto(ActionEvent event){
        int idBanco = sessionScopeBeangastos.getBancoBuscar();
        int idTipoGasto = sessionScopeBeangastos.getTipoGastoBuscar();
        Date fechaMin = sessionScopeBeangastos.getFechaMin();
        Date fechaMax = sessionScopeBeangastos.getFechaMax();
        
        GastoBean bean = new GastoBean();
            bean.setIdBanco(idBanco);
            bean.setIdTipoGasto(idTipoGasto);
            bean.setFechaMin(fechaMin);
            bean.setFechaMax(fechaMax);
              
        sessionScopeBeangastos.setListaGastos(lN_SFGastoRemote.getGastoByFiltro(bean));
        getTbGastos().setValue(sessionScopeBeangastos.getListaGastos());
        Utils.addTarget(getTbGastos());
        
        Utils.clearRowSelection(getTbGastos());
    }
    
    public void abrirPOPAgregarBanco(){
        sessionScopeBeangastos.setNombreBanco("");
        Utils.showPopUpAFTER_START(getPopAgregarBanco(), btnAgregarBanco);
    }
    
    public void agregarBanco(){
        BancoBean bean = new BancoBean();
        String nombre = sessionScopeBeangastos.getNombreBanco();
        bean.setNombre(nombre);
        
        lN_SFBancoRemote.addBanco(bean);
        getPopAgregarBanco().hide();
        Utils.showMessage("Se ingreso correctamente un Banco", null, 2);
        
        ArrayList bancos = this.llenarBancos();
        sessionScopeBeangastos.setListaBanco(bancos);
        Utils.addTarget(getSelectBancoAgregar());
        Utils.addTarget(getSelectBancoBuscar());
        limpiarRefrescar(null);
    }
    
    public void abrirPOPAgregarTGasto(ActionEvent event){
        sessionScopeBeangastos.setNombreTipoGasto("");
        
        Utils.showPopUpAFTER_START(getPopAgregarGasto(), getBtnAgregarTGasto());
    }
    
    public void agregarTGasto(ActionEvent event){
        TipogastoBean bean = new TipogastoBean();
        String tGasto = sessionScopeBeangastos.getNombreTipoGasto();
        
        bean.setDescripcion(tGasto);
        bean.setEstado(1);
        
        getPopAgregarGasto().hide();
        Utils.showMessage("Se ingreso correctamente un Tipo de Gasto", null, 2);
        
        lN_SFTipogastoRemote.addTGasto(bean);
        ArrayList tGastos = this.llenaTGasto();
        Utils.addTarget(getSelecTipoGastoAgregar());
        Utils.addTarget(getSelectTipoGastoBuscar());
        limpiarRefrescar(null);
        this.refrescarGrafico(null);
    }
    
    public ArrayList llenaTGasto(){
        ArrayList tipo = new ArrayList();
        List<TipogastoBean> listaBean = lN_SFTipogastoRemote.getAllTiposGastoActivos();
        for(TipogastoBean bean : listaBean){
            tipo.add(new SelectItem(bean.getIdTipoGasto(),bean.getDescripcion()));
        }
        return tipo;
    }
    
    public ArrayList llenarBancos(){
        ArrayList bancos = new ArrayList();
        List<BancoBean> listaBean = lN_SFBancoRemote.getAllbancosActivos();
        for(BancoBean bean : listaBean){
            bancos.add(new SelectItem(bean.getIdBanco(),bean.getNombre()));
        }
        return bancos;
    }
    
    public ArrayList llenarEstados() {
        ArrayList estados = new ArrayList();
        estados.add(new SelectItem(0,"Inactivo"));
        estados.add(new SelectItem(1,"Activo"));
        return estados;
    }
    
    public ArrayList llenarDepartamentos() {
        ArrayList departamentos = new ArrayList();
        List<chemtools_logica.Entidades.Ubigeo> lista = lN_SFUbigeoRemote.getAllDepartamentos();
        for(chemtools_logica.Entidades.Ubigeo ent : lista){
            departamentos.add(new SelectItem(ent.getCod_dept(),ent.getDepartamento()));
        }
        return departamentos;
    }
    
    public void llenarProvincias(ValueChangeEvent valueChangeEvent){
        String idDepartamento = valueChangeEvent.getNewValue().toString();
        ArrayList provincias = new ArrayList();
        List<chemtools_logica.Entidades.Ubigeo> lista = lN_SFUbigeoRemote.getProvincias(idDepartamento);
        for(chemtools_logica.Entidades.Ubigeo ent : lista){
            provincias.add(new SelectItem(ent.getCod_prov(),ent.getProvincia()));
        }
        sessionScopeBeangastos.setListaProv(provincias);
        Utils.addTarget(getSelectProvincia());
    }
    
    public void llenarDistritos(ValueChangeEvent valueChangeEvent){
        String idProvincia = valueChangeEvent.getNewValue().toString();
        ArrayList distritos = new ArrayList();
        List<chemtools_logica.Entidades.Ubigeo> lista = lN_SFUbigeoRemote.getDistritos(idProvincia);
        for(chemtools_logica.Entidades.Ubigeo ent : lista){
            distritos.add(new SelectItem(ent.getCod_dist(),ent.getDistrito()));
        }
        sessionScopeBeangastos.setListaDist(distritos);
        Utils.addTarget(getSelectDistrito());
    }
    
    private static Context getInitialContext() throws NamingException {
        Hashtable env = new Hashtable();
        // WebLogic Server 10.x/12.x connection details
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        env.put(Context.PROVIDER_URL, "t3://127.0.0.1:7101");
        return new InitialContext(env);
    }

    public void setFormGastos(RichForm formGastos) {
        this.formGastos = formGastos;
    }

    public RichForm getFormGastos() {
        return formGastos;
    }

    public void setSessionScopeBeangastos(bSessionScopeBeangastos sessionScopeBeangastos) {
        this.sessionScopeBeangastos = sessionScopeBeangastos;
    }

    public bSessionScopeBeangastos getSessionScopeBeangastos() {
        return sessionScopeBeangastos;
    }

    public void setBtnEditar(RichButton btnEditar) {
        this.btnEditar = btnEditar;
    }

    public RichButton getBtnEditar() {
        return btnEditar;
    }

    public void setPopEditar(RichPopup popEditar) {
        this.popEditar = popEditar;
    }

    public RichPopup getPopEditar() {
        return popEditar;
    }

    public void setTbGastos(RichTable tbGastos) {
        this.tbGastos = tbGastos;
    }

    public RichTable getTbGastos() {
        return tbGastos;
    }

    public void setPopAgregar(RichPopup popAgregar) {
        this.popAgregar = popAgregar;
    }

    public RichPopup getPopAgregar() {
        return popAgregar;
    }

    public void setSelectBancoAgregar(RichSelectOneChoice selectBancoAgregar) {
        this.selectBancoAgregar = selectBancoAgregar;
    }

    public RichSelectOneChoice getSelectBancoAgregar() {
        return selectBancoAgregar;
    }

    public void setSelecTipoGastoAgregar(RichSelectOneChoice selecTipoGastoAgregar) {
        this.selecTipoGastoAgregar = selecTipoGastoAgregar;
    }

    public RichSelectOneChoice getSelecTipoGastoAgregar() {
        return selecTipoGastoAgregar;
    }

    public void setSelectTipoGastoBuscar(RichSelectOneChoice selectTipoGastoBuscar) {
        this.selectTipoGastoBuscar = selectTipoGastoBuscar;
    }

    public RichSelectOneChoice getSelectTipoGastoBuscar() {
        return selectTipoGastoBuscar;
    }

    public void setSelectBancoBuscar(RichSelectOneChoice selectBancoBuscar) {
        this.selectBancoBuscar = selectBancoBuscar;
    }

    public RichSelectOneChoice getSelectBancoBuscar() {
        return selectBancoBuscar;
    }

    public void setBtnAgregarBanco(RichButton btnAgregarBanco) {
        this.btnAgregarBanco = btnAgregarBanco;
    }

    public RichButton getBtnAgregarBanco() {
        return btnAgregarBanco;
    }

    public void setPopAgregarBanco(RichPopup popAgregarBanco) {
        this.popAgregarBanco = popAgregarBanco;
    }

    public RichPopup getPopAgregarBanco() {
        return popAgregarBanco;
    }

    public void setBtnAgregarTGasto(RichButton btnAgregarTGasto) {
        this.btnAgregarTGasto = btnAgregarTGasto;
    }

    public RichButton getBtnAgregarTGasto() {
        return btnAgregarTGasto;
    }

    public void setPopAgregarGasto(RichPopup popAgregarGasto) {
        this.popAgregarGasto = popAgregarGasto;
    }

    public RichPopup getPopAgregarGasto() {
        return popAgregarGasto;
    }

    public void setSelectProvincia(RichSelectOneChoice selectProvincia) {
        this.selectProvincia = selectProvincia;
    }

    public RichSelectOneChoice getSelectProvincia() {
        return selectProvincia;
    }

    public void setSelectDistrito(RichSelectOneChoice selectDistrito) {
        this.selectDistrito = selectDistrito;
    }

    public RichSelectOneChoice getSelectDistrito() {
        return selectDistrito;
    }

    public void setDateFechaMin(RichInputDate dateFechaMin) {
        this.dateFechaMin = dateFechaMin;
    }

    public RichInputDate getDateFechaMin() {
        return dateFechaMin;
    }

    public void setDateFechaMax(RichInputDate dateFechaMax) {
        this.dateFechaMax = dateFechaMax;
    }

    public RichInputDate getDateFechaMax() {
        return dateFechaMax;
    }

    public void setChartGastos(UIBarChart chartGastos) {
        this.chartGastos = chartGastos;
    }

    public UIBarChart getChartGastos() {
        return chartGastos;
    }

    public void setBarch(UIGraph barch) {
        this.barch = barch;
    }

    public UIGraph getBarch() {
        return barch;
    }

    public void setDatoChart(UIDataItem datoChart) {
        this.datoChart = datoChart;
    }

    public UIDataItem getDatoChart() {
        return datoChart;
    }
}
